// 解题思路：
// 找最长回文子序列的长度，可以采用区间 dp 的方法
// 如果定义 dp[i][j] 表示以 i 开头 j 结尾的最长回文子序列的长度，那么在推导状态转移方程的时候不好推导
// 因此要定义 dp[i][j] 表示 [i, j] 区间的最长回文子序列的长度
// 当 i == j 时，最长回文子序列的长度为 1
// 当 i != j 时，分两种情况讨论：
// 如果 s[i] == s[j]: dp[i][j] = dp[i + 1][j - 1] + 2
// 如果 s[i] != s[j]: dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1])
// 填表时需要注意，因为填表要依赖下面值，因此需要从下往上填表，每一行从左往右
// 返回 dp[0][n - 1] 即可

import java.util.*;

public class MaxPalindromSubsequenceLength {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        char[] s = in.next().toCharArray();
        int n = s.length;
        int[][] dp = new int[n][n];

        for(int i = n - 1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(i == j) dp[i][j] = 1;
                else {
                    if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2;
                    else dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);
                }
            }
        }
        System.out.println(dp[0][n - 1]);
    }
}
